package main.java.br.com.projeto.domain.entity;

import java.util.Date;
import java.util.InputMismatchException;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;

@Entity
public class Funcionario extends PessoaFisica {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = -8941205926192747705L;

	@Column(length=20)
	private String carteiraTrabalho;

	private Float comissao;

	@Column(length=20)
	private String status;

	@Column(nullable=false)
	private Date dataAdmissao;
	
	@Column
	private Date dataDemissao;	

	@ManyToOne(fetch=FetchType.LAZY, optional=false)
	private Cargo cargo;
	
	private Float salario;
	
	@ManyToMany(fetch = FetchType.LAZY)
	@JoinTable(name="servico_funcionario",
			joinColumns={@JoinColumn(name="funcionario_id")},
			inverseJoinColumns={@JoinColumn(name="servico_id")})
	private List<Servico> servicos;
	
	public String getCarteiraTrabalho() {
		return carteiraTrabalho;
	}
	public void setCarteiraTrabalho(String carteiraTrabalho) {
		this.carteiraTrabalho = carteiraTrabalho;
	}
	public Float getComissao() {
		return comissao;
	}
	public void setComissao(Float comissao) {
		this.comissao = comissao;
	}
	public String getStatus() {
		return status;
	}
	public void setStatus(String status) {
		this.status = status;
	}
	public Date getDataAdmissao() {
		return dataAdmissao;
	}
	public void setDataAdmissao(Date dataAdmissao) {
		this.dataAdmissao = dataAdmissao;
	}
	public Date getDataDemissao() {
		return dataDemissao;
	}
	public void setDataDemissao(Date dataDemissao) {
		this.dataDemissao = dataDemissao;
	}
	public Cargo getCargo() {
		return cargo;
	}
	public void setCargo(Cargo cargo) {
		this.cargo = cargo;
	}
	public Float getSalario() {
		return salario;
	}
	public void setSalario(Float salario) {
		this.salario = salario;
	}
	public List<Servico> getServicos() {
		return servicos;
	}
	public void setServicos(List<Servico> servicos) {
		this.servicos = servicos;
	}
	

	@Override
	public boolean equals(Object obj) {
		if (this == obj) 
			return true;
		
		Funcionario other = (Funcionario) obj;
		
		if (id == other.getId())
			return true;
		
		return false;
	}
	
	public boolean isCPF(String CPF) {
	// considera-se erro CPF's formados por uma sequencia de numeros iguais
	if (CPF.equals("00000000000") || CPF.equals("11111111111") ||
			CPF.equals("22222222222") || CPF.equals("33333333333") ||
			CPF.equals("44444444444") || CPF.equals("55555555555") ||
			CPF.equals("66666666666") || CPF.equals("77777777777") ||
			CPF.equals("88888888888") || CPF.equals("99999999999") ||
			(CPF.length() != 11))
		       return false;
	
	char dig10, dig11;
	int sm, i, r, num, peso;
		 
	// "try" - protege o codigo para eventuais erros de conversao de tipo (int)
	try {
	// Calculo do 1o. Digito Verificador
		sm = 0;
		peso = 10;
		for (i=0; i<9; i++) {             
		// converte o i-esimo caractere do CPF em um numero:
		// por exemplo, transforma o caractere '0' no inteiro 0        
		// (48 eh a posicao de '0' na tabela ASCII)
			num = (int)(CPF.charAt(i) - 48);
			sm = sm + (num * peso);
			peso = peso - 1;
		}
		
		r = 11 - (sm % 11);
		if ((r == 10) || (r == 11))
				dig10 = '0';
		else dig10 = (char)(r + 48); // converte no respectivo caractere numerico
		 
		// Calculo do 2o. Digito Verificador
		sm = 0;
		peso = 11;
		for(i=0; i<10; i++) {
			num = (int)(CPF.charAt(i) - 48);
			sm = sm + (num * peso);
			peso = peso - 1;
		}
		
		r = 11 - (sm % 11);
		
		if ((r == 10) || (r == 11))
			dig11 = '0';
		else dig11 = (char)(r + 48);
		 
		// Verifica se os digitos calculados conferem com os digitos informados.
		if ((dig10 == CPF.charAt(9)) && (dig11 == CPF.charAt(10)))
			return true;
		else 
			return(false);
		} catch (InputMismatchException erro) {
			return false;
		}
	}
	
	public boolean validaCPF() {
		this.cpf = this.cpf.replaceAll("[\\D]", "");
		this.cpf = this.cpf.replace("-", "");
		return isCPF( this.cpf );
	}
}
